#define MAX_SIZE 255

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

#include "DataElement.h"
#include "SequenceList.h"
#include "LinkList.h"
#include "CircularLinkList.h"

void TestSequenctList();

void TestLinkList();

void TestCircularLinkList();

/* 抽象数据类型数组元素 */
ElementType dataArray[] =
        {
                {1, "C语言"},
                {2, "Java高级"},
                {3, "Python高级"},
                {4, "C++高级"},
                {5, "GOLang高级"}
        };

int main() {

    /**
     * 顺序表删除问题:
     *  删除之后输出应该没有删除的那个元素,但是依然显示了该元素
     */
    // TestSequenctList();

    //TestLinkList();

    TestCircularLinkList();

    return 0;
}

/* 顺序表测试 */
void TestSequenctList() {
    /* 要操作的顺序表 */
    SeqList seqList;
    ElementType *delElement;

    int length = sizeof(dataArray) / sizeof(dataArray[0]);
    /* 调用初始化顺序表方法 */
    InitList(&seqList, dataArray, length);
    /**
     * 输出顺序表
     * TODO: bug about seqList length
     * TODO: fix this bug in Init for in length-1 change to length
     * */
    PrintList(&seqList);

    /* 删除顺序表下标为 2 的元素信息 */
    delElement = DeleteElement(&seqList, 2);
    printf("删除后\n");
    // TODO: show bug ...
    PrintList(&seqList);

    printf("被删除的元素: \n");
    printf("%d\t%s", delElement->id, delElement->name);

    /* 一定要记得释放分配的内存 */
    free(delElement);
}

/* 单链表测试 */
void TestLinkList() {
    LinkList linkList;
    /* 将链表的长度置为 0 */
    linkList.length = 0;
    /* TODO: 显示链表插入元素个数缺少问题  */
    InitLinkList(&linkList, dataArray, sizeof(dataArray) / sizeof(dataArray[0]));
    printf("\n链表输出: \n");
    PrintLinkList(&linkList);

    ElementType element;
    element.id = 211321059;
    element.name = (char *) malloc(100);
    strcpy(element.name, "coder-itl");
    /**
     * 向链表的第二个位置插入元素 element
     * TODO: 为什么插入在 1号位置就不能正确输出
     * */
    InsertLinkList(&linkList, 2, element);
    printf("插入后: \n");
    PrintLinkList(&linkList);

    /* 删除节点测试 */
    printf("\n删除第三个元素后: \n");
    DeleteLinkListElement(&linkList, 2);
    PrintLinkList(&linkList);

    /* 清空链表 */
    printf("\n清空链表: \n");
    ClearLinkList(&linkList);
    PrintLinkList(&linkList);
}

/* 循环链表的测试 */
void TestCircularLinkList() {
    CircularLinkList *clList = (CircularLinkList *) malloc(sizeof(CircularLinkList));
    clList->length = 0;
    clList->next = NULL;
    InitCircularLinkList(clList, dataArray, sizeof(dataArray) / sizeof(dataArray[0]));
    PrintCircularLinkList(clList);

}